# 3、编程题(文件:poly_exercise_02.py)
# 1)定义员工类Employee，包含私有属性(姓名和月工资)，以及计算年工资get annual的方法
# 2)普通员工(Worker)和经理(Manager)继承员工类，经理类多了奖金bonus属性和管理manage方法，普通员工类多了work方法，普通员工和经理类要求根据需要重写get annual方法
# 3)编写函数show emp annual(e:Employee)，实现获取任何员工对象的年工资
# 4)编写函数working(e:Employee),如果是普通员工，则调用work方法，如果是经理，则调用manage方法

# 定义员工基类
class Employee:
    # 私有变量：员工姓名
    __name = None
    # 私有变量：员工月薪
    __month_salary = None

    # 构造方法，初始化员工姓名和月薪
    def __init__(self, name, month_salary):
        self.__name = name
        self.__month_salary = month_salary

    # 获取员工姓名
    def get_name(self):
        return self.__name

    # 设置员工姓名
    def set_name(self, name):
        self.__name = name

    # 获取员工月薪
    def get_month_salary(self):
        return self.__month_salary

    # 设置员工月薪
    def set_month_salary(self, month_salary):
        self.__month_salary = month_salary

    # 计算员工年工资
    def get_annual(self):
        return self.get_month_salary() * 12

# 定义普通员工类，继承自员工基类
class Worker(Employee):

    # 定义普通员工的工作方法
    def work(self):
        print("员工%s正在工作..." % self.get_name())

# 定义经理类，继承自员工基类
class Manager(Employee):
    # 私有变量：经理奖金
    __bonus = None

    # 构造方法，初始化经理的姓名、月薪和奖金
    def __init__(self, name, month_salary, bonus):
        super().__init__(name, month_salary)
        self.__bonus = bonus

    # 重写年工资计算方法，加入奖金
    def get_annual(self):
        return super().get_annual() + self.__bonus

    # 定义经理的管理方法
    def manage(self):
        print("经理%s正在管理..." % self.get_name())

# 定义函数，用于显示员工的年工资
def show_emp_annual(e: Employee):
    print(f"{e.get_name()}的年工资是{e.get_annual()}")

# 创建普通员工实例并显示其年工资
w = Worker("king", 10000)
show_emp_annual(w)

# 创建经理实例并显示其年工资
m = Manager("jack", 20000, 5000)
show_emp_annual(m)

# 编写函数working(e:Employee),根据员工类型调用相应方法
def working(e: Employee):
    # 如果是普通员工，调用work方法
    if isinstance(e, Worker):
        e.work()
    # 如果是经理，调用manage方法
    elif isinstance(e, Manager):
        e.manage()
    else:
        print("未知员工类型")

# 分别对普通员工和经理调用working函数
working(w)
working(m)
